﻿#include "study10.h"
// C/C++ 标准库学习网站：https://legacy.cplusplus.com
// C/C++ 微软(Visual Studio)中文学习网站：https://learn.microsoft.com/zh-cn/cpp/cpp/?view=msvc-170
using namespace std; // 命名空间声明

struct Person { // 定义结构体
    string name;
    int age;

    Person()
        : name("default name"), age(0) {
    } // 默认构造函数

    Person(string name, int age)
        : name(name), age(age) {
    } // 构造函数

    void print() {
        cout << "name: " << name << ", age: " << age << endl; // 输出结构体数据
    }
};

class Info {
private:
    Person m_person; // 结构体成员变量
    string m_address; // 地址信息
    size_t m_money; // 金额
public:
    Info()
        : m_person(), m_address("default address"), m_money(0) {
    } // 默认构造函数

    Info(Person person, string address = "default address", size_t money = 0)
        : m_person(person), m_address(address), m_money(money) {
    } // 构造函数

    Person& get_person() { // 结构体成员函数
        return m_person;
    }

    void set_person(string name, int age) { // 结构体成员函数
        m_person.name = name;
        m_person.age = age;
    }

    void set_address(string address) { // 结构体成员函数
        m_address = address;
    }

    void set_money(size_t money) { // 结构体成员函数
        m_money = money;
    }

    tuple<Person, string, size_t> get_info_data() { // 结构化绑定函数
        return make_tuple(m_person, m_address, m_money); // 返回一个元组
    }
};

static tuple<string, int> get_data() { // 定义一个函数，返回一个元组
    //return make_tuple("default data", 100); // 返回一个元组
    return { "default data", 100 }; // 返回一个初始化列表
}

void test_return_value() {
    // 测试元组数据返回
    auto data1 = get_data();
    cout << "data1: " << get<0>(data1) << ", " << get<1>(data1) << endl; // 输出元组数据, string 和 int 类型数据
    string name1;
    int age1;
    tie(name1, age1) = get_data(); // std::tie() 函数用于绑定元组数据到变量
    cout << "name1: " << name1 << ", age1: " << age1 // 输出变量数据
        << "\n--------------------------------------------\n";

    // 测试结构体数据返回
    auto person1 = Person("Lolita", 16); // 调用默认构造函数
    person1.print(); // 输出结构体数据
    auto data2 = Info(person1); // 调用构造函数
    data2.set_person("Alice", 18); // 调用结构体成员函数
    Person& person2 = data2.get_person(); // 调用结构体成员函数
    person2.print(); // 输出结构体数据
    cout << "--------------------------------------------\n";

    // 测试结构化绑定
    auto [name2, age2] = get_data(); // 结构化绑定
    cout << "name2: " << name2 << ", age2: " << age2 // 输出变量数据
        << "\n--------------------------------------------\n";
    Info inf1 = Info(Person("tom", 20), "China", 1000000); // 调用构造函数
    auto [person3, address3, money3] = inf1.get_info_data(); // 结构化绑定
    person3.print(); // 输出结构体数据
    cout << "address3: " << address3 << ", money3: " << money3 << endl; // 输出变量数据
}